//输入一个整数数组，判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true，否则返回 false。假设输入的数组的任意两个数字都互不相同。 
//
// 
//
// 参考以下这颗二叉搜索树： 
//
//      5
//    / \
//   2   6
//  / \
// 1   3 
//
// 示例 1： 
//
// 输入: [1,6,3,2,5]
//输出: false 
//
// 示例 2： 
//
// 输入: [1,3,2,6,5]
//输出: true 
//
// 
//
// 提示： 
//
// 
// 数组长度 <= 1000 
// 
//
// Related Topics 栈 树 二叉搜索树 递归 二叉树 单调栈 👍 745 👎 0


package leetcode.editor.cn;

import java.util.Stack;

class 二叉搜索树的后序遍历序列 {
    public static void main(String[] args) {
        Solution solution = new 二叉搜索树的后序遍历序列().new Solution();
        System.out.println(solution.verifyPostorder(new int[]{1,2,5,10,6,9,4,3}));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {


        public boolean verifyPostorder(int[] postorder) {
            Stack<Integer> stack = new Stack<>();
            int root = Integer.MAX_VALUE;
            for (int i = postorder.length - 1; i >= 0; i--) {
                if (postorder[i] > root) return false;
                while (!stack.isEmpty() && stack.peek() > postorder[i]){
                    root = stack.pop();
                }
                stack.add(postorder[i]);
            }
            
            return true;
        }
        
        
        
        
        
        
        int[] postorder;

        public boolean verifyPostorder1(int[] postorder) {
            this.postorder = postorder;
            return merge(0, postorder.length - 1);
        }

        boolean merge(int left, int right) {
            if (left >= right) return true;
            int mid = left;
            while(postorder[mid] < postorder[right]) mid++;
            int temp = mid;
            while(temp < right) {
                if (postorder[temp++] < postorder[right])
                    return false;
            }
            return merge(left, mid - 1) && merge(mid, right - 1);
        
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
